﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//构造类型：自定义类型
//数组类型，结构体类型，枚举类型，联合类型
//指针类型
//void空类型：用于函数返回类型（不返回值），函数的参数（不需要传参），指针类型（void*）

//int main() {
//	int a = 20;
//	//20
//	//00000000000000000000000000010100--原反补码
//	//每四个二进制位写成一个十六进制位
//	//0x00 00 00 14
//
//	int b = -10;
//	//10000000000000000000000000001010--原码
//	//0x80 00 00 0a
//	//11111111111111111111111111110101--反码
//	//0xff ff ff f5
//	//11111111111111111111111111110110--补码
//	//0xff ff ff f6
//	return 0;
//}
//内存数据存放是二进制的，展示的是十六进制
//数据在内存存放的是补码二进制序列
//最高位即符号位，后面的数值位，0正1负
//原码->补码 （原码取反+1）
//补码->原码 （补码取反+1）计算逻辑一模一样，补码的补码是原码

//数据存储字节顺序
//大端字节序存储，正放，把高位字节序存在低地址处
//小端字节序存储，倒放，把低位字节序存在高地址处

//判断数据存储字节顺序
//int main() {
//	int a = 1;
//	char* p = (char*) & a;
//	if (*p == 0) {
//		printf("大端");
//	}
//	else {
//		printf("小端");
//	}
//	return 0;
//}

//无符号char（0~255）
//有符号char（-128~127）
//int main() {
//	char a = -1;
// //1000000000000000000000000000001//-1整型，a是char。要发生截断
// //1111111111111111111111111111110
// //1111111111111111111111111111111
// //截断（留低字节）
// //11111111 - a
// //整型提升
// //1111111111111111111111111111111 - 内存中的补码
// //1000000000000000000000000000000
// //1000000000000000000000000000001 -> -1
// 
// 	signed char b = -1;
//	unsigned char c = -1;
//	printf("%d %d %d\n", a, b, c);
//	return 0;
//}

//整型提升
//有符号高位 补符号位的数，无符号直接补0

//int main() {
//	int i;
//	char a[1000];
//	for (i = 0; i < 1000; i++) {
//		a[i] = -1 - i;
//	}
//	//
//	//arr[i] --> char  -128~127
//	//-1 -2 -3 ... -128 127 126 125.. 2 1 0 -1..
//	//'\0'即值0，遇到0停止，即计算0前多少个数、
//	//128+127=255
//	printf("%d", strlen(a));//255
//	return 0;
//}

//无符号整数和无符号整数的计算结果仍是无符号的
// 有符号和无符号计算得无符号（无符号级别更高）

//整型和浮点型在存储和获取值的时候，方法不一样
//以什么形式存放，就以什么方式拿出

//浮点数的存储规则
//任意一个二进制浮点数v可以以下表示
//V=(-1)^S * M * 2^E
//(-1)^S 表示符号位，当S=0，V为正数；当S=1，V为负数
//M表示有效数字，M是大于等于1，小于2的
//2^E表示指数位
//例如
//V=9.5f = 1001.1 = 1.0011*2^3 = (-1)^0*1.0011*2^3
//即 S=0 M=1.0011 E=3
//小数点后的 化为2^(-1)即0.5
//小数点前整数化成二进制，小数点后每一位按2^(-n)计算

//浮点数的保存
//M保存时，舍去小数电前的1，只保存后面的
//等到读取时在默认加上，目的在于保存更多位的有效数字
//E是一个无符号整数，但E是会出现负数的
//所以E的保存要加上中间值
//8位：取值范围0~255，加中间数127
//11位：取值范围0~2047，加中间数1023
//浮点数无法精确保存

//浮点数的取出
//E不全为0或不全为1
//指数E的计算值减去127（或1023）
//有效数字M前加上第⼀位的1，后补齐0到23位
//E全为0
//指数E等于1-127（或者1-1023）即为真实值
//有效数字M不再加上第⼀位的1，⽽是还原为0.xxxxxx的⼩数
//E全为1
//如果有效数字M全为0，表⽰±⽆穷⼤（正负取决于符号位s）